//
//  SSWBCompose.swift
//  shanshanlol微博
//
//  Created by 叶竞泽 on 2017/2/8.
//  Copyright © 2017年 JingZe. All rights reserved.
//

import UIKit

class SSWBComposeTextView: UITextView {
    
    /// 返回textView对应的纯文本 - 将属性图片转换成文字
    var emoticonText: String? {
        
        
        // 1.获取textView的属性文本
        guard let attrString = attributedText else {
            return ""
        }
        
        var result = String()
        
        // 2.需要获得属性文本中的图片
        attrString.enumerateAttributes(in: NSRange(location: 0, length: attrString.length), options: [], using: { (dict, range, _) in
            
            if let attachment = dict["NSAttachment"] as? SSEmoticonAttachment {
                
                result += attachment.chs ?? ""
                
            } else {
                
                let subString = (attrString.string as NSString?)?.substring(with: range) ?? ""
                
                result += subString
            }
        })
        
        
        return result
    }


    /// 占位文本Label
    fileprivate lazy var placeholderLabel: UILabel = UILabel()
    
    // MARK: - 生命周期
    
    override func awakeFromNib() {
        
        // 设置界面
        setupUI()
        
        // 注册通知
        NotificationCenter.default.addObserver(self, selector: #selector(textChanged(notification:)), name: NSNotification.Name.UITextViewTextDidChange, object: self)
        
    }
    
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    
    // MARK: - 监听方法
    
    @objc fileprivate func textChanged(notification: Notification) {
        
        // 如果有文本,不显示占位标签,否则显示
        placeholderLabel.isHidden = hasText
    }
}

// MARK: - 表情键盘专属方法
extension SSWBComposeTextView {
    
    
    /// 向文本内容里面添加表情图片
    ///
    /// - Parameter emoticon: emoticon
    func insert(emoticon: SSEmoticon?) {
        
        
        // 所有的排版系统中,插入的字符的显示,跟随前一个字符的属性,但是本身没有属性
        
        // 1.判断emotion是否为nil,如果为nil,就是删除按钮
        guard let emoticon = emoticon else {
            
            // 删除文本
            self.deleteBackward()
            
            return
        }
        
        // 2.添加emoji
        if let emoji = emoticon.emoji, let textRange = self.selectedTextRange {
            
            // 插入emoji - UITextRange仅用在此处
            self.replace(textRange, withText: emoji)
            return
        }
        
        // 3.添加图片
        // 3.1获取表情中的图像属性文本
        let imageText = emoticon.imageText(font: self.font!)
        // 3.2获取当前textView的属性文本
        let attrM = NSMutableAttributedString(attributedString: self.attributedText)
        // 3.3将图像的属性文本插入到当前的光标位置
        attrM.replaceCharacters(in: self.selectedRange, with: imageText)
        // 3.4重新设置属性文本
        // 3.4.1记录光标位置
        let range = self.selectedRange
        // 3.4.2设置文本
        self.attributedText = attrM
        // 3.4.3恢复光标位置
        self.selectedRange = NSRange(location: range.location + 1, length: 0)
        // 4.让代理执行文本变化的方法 - 在需要的时候,通知代理执行协议方法
        delegate?.textViewDidChange?(self)
        // 5.执行当前textView的文本变化方法
        textChanged(notification: Notification(name: NSNotification.Name.UITextViewTextDidChange))
    }
    
}

// MARK: - 设置界面
fileprivate extension SSWBComposeTextView {
    
    fileprivate func setupUI() {
        
        // 1.设置占位标签
        placeholderLabel.text = "分享新鲜事..."
        placeholderLabel.font = font
        placeholderLabel.textColor = UIColor.lightGray
        placeholderLabel.sizeToFit()
        placeholderLabel.frame.origin = CGPoint(x: 5, y: 8)
        addSubview(placeholderLabel)
        
    }
}


